# -*- coding: utf-8 -*-
import pandas as pd
import numpy as np
import plotly.express as px

# 第一步：读取三个CSV文件
abbrevs_df = pd.read_csv('CSV/state-abbrevs.csv')
areas_df = pd.read_csv('CSV/state-areas.csv')
population_df = pd.read_csv('CSV/state-population.csv')

# 第二步：合并数据（以州名为主键）
merged_df = pd.merge(abbrevs_df, areas_df, how='left', left_on='state.name', right_on='state_name')
merged_df = pd.merge(merged_df, population_df, how='left', left_on='state.name', right_on='STATE')

# 第三步：检查缺失值
print("\n缺失值统计：")
print(merged_df.isnull().sum())

# 第四步：设置索引为州名
merged_df.set_index('state.name', inplace=True)

# 第五步：按2019年估计人口排序
sorted_df = merged_df.sort_values(by='POPESTIMATE2019', ascending=False)
print("\n按人口排序后的前5位州：")
print(sorted_df[['POPESTIMATE2019', 'Income', 'Life.Exp']].head())

# 第六步：绘图 - 收入与人口关系
fig1 = px.scatter(
    merged_df,
    x="Income",
    y="POPESTIMATE2019",
    hover_name=merged_df.index,
    title="各州收入与人口估计值（2019）",
    labels={"Income": "平均收入", "POPESTIMATE2019": "2019年估计人口"}
)
fig1.show()

# 第七步：绘图 - 文盲率与预期寿命
fig2 = px.scatter(
    merged_df,
    x="Illiteracy",
    y="Life.Exp",
    hover_name=merged_df.index,
    size="HS.Grad",
    title="文盲率与预期寿命的关系",
    labels={"Illiteracy": "文盲率", "Life.Exp": "预期寿命"}
)
fig2.show()

# 第八步：绘图 - 人口最多的前10个州，改为横向条形图，贴近目标样式
top10 = sorted_df.head(10).reset_index()

fig3 = px.bar(
    top10,
    y="state.name",  # 改为y轴显示州名，实现横向条形
    x="POPESTIMATE2019",  # x轴显示人口数
    title="2019年人口最多的前10个州",
    labels={"state.name": "州名", "POPESTIMATE2019": "人口估计数"},
    color_discrete_sequence=["#1f77b4"],  # 统一条形颜色，类似目标样式的蓝色
    text="POPESTIMATE2019"  # 显示数值标签
)

# 设置数值标签显示在条形右侧
fig3.update_traces(textposition="outside")
# 隐藏图例，让图表更简洁
fig3.update_layout(showlegend=False)
# 可根据需要调整x轴、y轴字体等样式，比如让州名显示更清晰
fig3.update_yaxes(tickfont=dict(size=12))
fig3.update_xaxes(tickfont=dict(size=12))

fig3.show()